<?php

class Platnoscipl extends PaymentModule
{
	private	$_html = '';
	private $_postErrors = array();

	private $error_messages = array(
			"100" => "brak parametru pos id",
			"101" => "brak parametru session id",
			"102" => "brak parametru ts",
			"103" => "brak parametru sig",
			"104" => "brak parametru desc",
			"105" => "brak parametru client ip",
			"106" => "brak parametru first name",
			"107" => "brak parametru last name",
			"108" => "brak parametru street",
			"109" => "brak parametru city",
			"110" => "brak parametru post code",
			"111" => "brak parametru amount",
			"112" => "błędny numer konta bankowego",
			"200" => "inny chwilowy błąd",
			"201" => "inny chwilowy błąd bazy danych",
			"202" => "POS o podanym identyfikatorze jest zablokowany",
			"203" => "niedozwolona wartość pay_type dla danego pos_id",
			"204" => "podana metoda płatnosci (wartość pay_type) jest chwilowo zablokowana dla danego pos_id, np. przerwa konserwacyjna bramki płatniczej",
			"205" => "kwota transakcji mniejsza od wartości minimalnej",
			"206" => "kwota transakcji większa od wartości maksymalnej",
			"207" => "przekroczona wartość wszystkich transakcji dla jednego klienta w ostatnim przedziale czasowym",
			"208" => "POS działa w wariancie ExpressPayment lecz nie nastapiła aktywacja tego wariantu współpracy (czekamy na zgode działu obsługi klienta)",
			"209" => "błedny numer pos_id lub pos_auth_key",
			"500" => "transakcja nie istnieje",
			"501" => "brak autoryzacji dla danej transakcji",
			"502" => "transakcja rozpoczęta wcześniej",
			"503" => "autoryzacja do transakcji była już przeprowadzana",
			"504" => "transakcja anulowana wcześniej",
			"505" => "transakcja przekazana do odbioru wcześniej",
			"506" => "transakcja już odebrana",
			"507" => "błąd podczas zwrotu środków do klienta",
			"599" => "błędny stan transakcji, np. nie można uznać transakcji kilka razy lub inny, prosimy o kontakt",
			"999" => "inny błąd krytyczny - prosimy o kontakt	"
	);

	public function __construct()
	{
		$this->name = 'platnoscipl';
		$this->tab = 'payments_gateways';
		$this->version = 0.3;

		parent::__construct();

		$this->page = basename(__FILE__, '.php');
		$this->displayName = $this->l('platnoscipl');
		$this->description = $this->l('Akcepuje płatności przez serwis platnosci.pl');
	}

	public function getPlatnosciUrl()
	{
			return 'https://www.platnosci.pl/paygw/UTF/NewPayment';
			
	}

	public function install()
	{
		if (!parent::install() OR !Configuration::updateValue('PLATNOSCI_POS_ID', '')
			OR !Configuration::updateValue('PLATNOSCI_AUTH_KEY_1', '') OR !Configuration::updateValue('PLATNOSCI_AUTH_KEY_2', '') OR !Configuration::updateValue('PLATNOSCI_POS_AUTH_KEY', '')
			OR !$this->registerHook('payment') OR !$this->registerHook('paymentReturn'))
			return false;
		
		if (Validate::isInt(Configuration::get('PAYMENT_NEW_STATE')) XOR (Validate::isLoadedObject($order_state_new = new OrderState(Configuration::get('PAYMENT_NEW_STATE')))))
		{
			$order_state_new = new OrderState();
			$order_state_new->name[Language::getIdByIso("pl")] = "Rozpoczęcie płatności";
			$order_state_new->name[Language::getIdByIso("en")] = "Payment start";
			$order_state_new->send_email = false;
			$order_state_new->invoice = false;
			$order_state_new->unremovable = false;
			$order_state_new->color = "lightblue";
			if (!$order_state_new->add())
				return false;
			if(!Configuration::updateValue('PAYMENT_NEW_STATE', $order_state_new->id))
				return false;
		}
		
		$order_state_new = null;

		if (Validate::isInt(Configuration::get('PAYMENT_AWAITING_RECEIPT_STATE')) XOR (Validate::isLoadedObject($order_state_new = new OrderState(Configuration::get('PAYMENT_AWAITING_RECEIPT_STATE')))))
		{
			$order_state_new = new OrderState();
			$order_state_new->name[Language::getIdByIso("pl")] = "Płatność oczekuje na odbiór";
			$order_state_new->name[Language::getIdByIso("en")] = "Payment awaiting reception.";
			$order_state_new->send_email = false;
			$order_state_new->invoice = false;
			$order_state_new->unremovable = false;
			$order_state_new->color = "lightblue";
			if (!$order_state_new->add())
				return false;
			if(!Configuration::updateValue('PAYMENT_AWAITING_RECEIPT_STATE', $order_state_new->id))
				return false;
		}

		return true;


	}

	public function uninstall()
	{
		if (!Configuration::deleteByName('PLATNOSCI_POS_ID') OR !Configuration::deleteByName('PLATNOSCI_AUTH_KEY_1')
			OR !Configuration::deleteByName('PLATNOSCI_AUTH_KEY_2') OR !Configuration::deleteByName('PLATNOSCI_POS_AUTH_KEY') OR !parent::uninstall())
			return false;
		return true;
	}

	public function getContent()
	{
		$this->_html = '<h2>platnosci.pl</h2>';
		if (isset($_POST['submitPlatnosci']))
		{
			if (empty($_POST['pos_id']))
				$this->_postErrors[] = $this->l('Musisz podać id POSa.');
			elseif (!Validate::isUnsignedInt($_POST['pos_id']))
				$this->_postErrors[] = $this->l('Id POSa musi być liczbą całkowitą.');
			if (empty($_POST['auth_key_1']))
				$this->_postErrors[] = $this->l('Musisz podać Klucz (MD5).');
			elseif (!Validate::isMd5($_POST['auth_key_1']))
				$this->_postErrors[] = $this->l('Klucz płatności musi być sygnaturą MD5.');
			if (empty($_POST['auth_key_2']))
				$this->_postErrors[] = $this->l('Musisz podać Drugi klucz (MD5).');
			elseif (!Validate::isMd5($_POST['auth_key_2']))
				$this->_postErrors[] = $this->l('Klucz płatności musi być sygnaturą MD5.');
			if (empty($_POST['pos_auth_key']))
				$this->_postErrors[] = $this->l('Musisz podać Klucz autoryzacji płatności (pos_auth_key).');


			if (!sizeof($this->_postErrors))
			{
				Configuration::updateValue('PLATNOSCI_POS_ID', intval($_POST['pos_id']));
				Configuration::updateValue('PLATNOSCI_AUTH_KEY_1', $_POST['auth_key_1']);
				Configuration::updateValue('PLATNOSCI_AUTH_KEY_2', $_POST['auth_key_2']);
				Configuration::updateValue('PLATNOSCI_POS_AUTH_KEY', $_POST['pos_auth_key']);
				$this->displayConf();
			}
			else
				$this->displayErrors();
		}

		$this->displayPlatnosci();
		$this->displayFormSettings();
		return $this->_html;
	}

	public function displayConf()
	{
		$this->_html .= '
		<div class="conf confirm">
			<img src="../img/admin/ok.gif" alt="'.$this->l('Potwierdzenie').'" />
			'.$this->l('Ustawienia zapisane').'
		</div>';


	}

	public function displayErrors()
	{
		$nbErrors = sizeof($this->_postErrors);
		$this->_html .= '
		<div class="alert error">
			<h3>'.($nbErrors > 1 ? $this->l('Wystapily') : $this->l('Wystapil')).' '.$nbErrors.' '.($nbErrors > 1 ? $this->l('bledy') : $this->l('blad')).'</h3>
			<ol>';
		foreach ($this->_postErrors AS $error)
			$this->_html .= '<li>'.$error.'</li>';
		$this->_html .= '
			</ol>
		</div>';
	}
	
	
	public function displayPlatnosci()
	{
		$this->_html .= '
		<img src="../modules/platnoscipl/platnosci.gif" style="float:left; margin-right:15px;" />
		<b>'.$this->l('Moduł pozwala na dokonywanie płatnosci przez platnosci.pl.').'</b><br /><br />
		'.$this->l('Przed użyciem modułu skonfiguruj swoje konto w platnosci.pl.').'
		<br /><br /><br />';
	}

	public function displayFormSettings()
	{
		$conf = Configuration::getMultiple(array('PLATNOSCI_POS_ID', 'PLATNOSCI_AUTH_KEY_1', 'PLATNOSCI_AUTH_KEY_2'));
		$pos_id = array_key_exists('pos_id', $_POST) ? $_POST['pos_id'] : (array_key_exists('PLATNOSCI_POS_ID', $conf) ? $conf['PLATNOSCI_POS_ID'] : '');
		$auth_key_1 = array_key_exists('auth_key_1', $_POST) ? $_POST['auth_key_1'] : (array_key_exists('PLATNOSCI_AUTH_KEY_1', $conf) ? $conf['PLATNOSCI_AUTH_KEY_1'] : '');
		$auth_key_2 = array_key_exists('auth_key_2', $_POST) ? $_POST['auth_key_2'] : (array_key_exists('PLATNOSCI_AUTH_KEY_2', $conf) ? $conf['PLATNOSCI_AUTH_KEY_2'] : '');
		$pos_auth_key = array_key_exists('pos_auth_key', $_POST) ? $_POST['pos_auth_key'] : (array_key_exists('PLATNOSCI_POS_AUTH_KEY', $conf) ? $conf['PLATNOSCI_POS_AUTH_KEY'] : '');

		$this->_html .= '
		<form action="'.$_SERVER['REQUEST_URI'].'" method="post">
		<fieldset>
			<legend><img src="../img/admin/contact.gif" />'.$this->l('Ustawienia').'</legend>
			<label>'.$this->l('Twoj identyfikator POS').'</label>
			<div class="margin-form"><input type="text" size="10" name="pos_id" value="'.$pos_id.'" /></div>
			<label>'.$this->l('Klucz (MD5)').'</label>
			<div class="margin-form"><input type="text" size="50" name="auth_key_1" value="'.$auth_key_1.'" /></div>
			<label>'.$this->l('Drugi klucz (MD5)').'</label>
			<div class="margin-form"><input type="text" size="50" name="auth_key_2" value="'.$auth_key_2.'" /></div>
			<label>'.$this->l('Klucz autoryzacji płatności (pos_auth_key)').'</label>
			<div class="margin-form"><input type="text" size="10" name="pos_auth_key" value="'.$pos_auth_key.'" /></div>
			<br /><center><input type="submit" name="submitPlatnosci" value="'.$this->l('Zapisz zmiany').'" class="button" /></center>
		</fieldset>
		</form><br /><br />
		<fieldset class="width3">
			<legend><img src="../img/admin/warning.gif" />'.$this->l('Informacje').'</legend>
			'.$this->l('Aby używac modułu platnosci.pl musisz skonfigurować konto platnosci.pl.').'<br /><br />
			'.$this->l('Wybierz').' <i>'.$this->l('Moje sklepy > (nazwa sklepu) > Lista puntów płatności (nazwa punktu)').'</i>, '.$this->l(' i ustaw:').'<br />
			<ul><li><b>'.$this->l('Adres powrotu błędnego: ').'</b> '.' <code>http://'.$_SERVER['HTTP_HOST'].__PS_BASE_URI__.'modules/'.$this->name.'/order-confirmation.php?orderid=%orderId%&error=%error%</code></li>
			<li><b>'.$this->l('Adres powrotu pozytywnego: ').'</b> '.' <code>http://'.$_SERVER['HTTP_HOST'].__PS_BASE_URI__.'modules/'.$this->name.'/order-confirmation.php?orderid=%orderId</code></li>			
			<li><b>'.$this->l('Adres raportów: ').'</b> '.' <code>http://'.$_SERVER['HTTP_HOST'].__PS_BASE_URI__.'modules/'.$this->name.'/validation.php</code></li>			
			<li><b>'.$this->l('Kodowanie przesyłanych danych: ').'</b>'.' <b>UTF-8</b></li></ul>'
			.$this->l('Musisz też skopiować pos_id, wartości kluczy MD5 i pos_auth_key z ustawień punktu płatności do konfiguracji tego modułu.').'
		</fieldset>';
	}

	public function hookPayment($params)
	{
		global $smarty;

		return $this->display(__FILE__, 'platnoscipl.tpl');
	}

	public function execPayment($cart)
	{
		global $smarty;
		$address = new Address(intval($cart->id_address_invoice));
		$customer = new Customer(intval($cart->id_customer));
		$pos_id = Configuration::get('PLATNOSCI_POS_ID');
		$pos_auth_key = Configuration::get('PLATNOSCI_POS_AUTH_KEY');
		$auth_key_1 = Configuration::get('PLATNOSCI_AUTH_KEY_1');
	
		if (!Validate::isUnsignedInt($pos_id))
			return $this->l('Blad platnosci: (nieprawidlowy identyfikator POS)');

		if (!Validate::isLoadedObject($address) OR !Validate::isLoadedObject($customer))
			return $this->l('Blad platnosci: (nieprawidlowy adres lub klient)');

		$cartproducts ='';
		foreach ($cart->getProducts() as $product)
			$cartproducts.=$product['name'].',';
		$cartproducts = substr_replace($cartproducts,"",-1);

		$pay_types_url = "https://www.platnosci.pl/paygw/UTF/xml/";
		$pay_types_url .= $pos_id;
		$pay_types_url .= "/";
		$pay_types_url .= substr($auth_key_1,0,2);
		$pay_types_url .= "/paytype.xml";

		if (!$feed = simplexml_load_file($pay_types_url))
			return $this->l('Nie można pobrać listy dostępnych płatności');

		$platnoscitablecss = '<style type="text/css" media="all">
								.platnoscitable * {border: none; padding:0px; margin: 0px;}
								.platnoscitable td {border: none; vertical-align: middle;  background: no-repeat left center transparent; height:61px;}
								.platnoscitable label {display:block; padding-left:90px;}
								.midspace {width:40px; text-align: right;}
							</style>';

		$platnoscitable = "<table class=\"platnoscitable\">\n";
		$i=1;
		foreach ($feed->paytype as $paytype) {
			if ($i&1){
				$platnoscitable .= "\n<tr>\n";
				$spacer = "";
			}else{
				$spacer = "class =\"midspace\"";
			}
			$platnoscitable .= "<td ".$spacer."><input type=\"radio\" name=\"pay_type\" value=\"".$paytype->type."\" id=\"".$paytype->type."\"/></td>\n";
			$platnoscitable .= "<td style=\"background-image: url(".$paytype->img.");\"><label for=\"".$paytype->type."\" class=\"lbl\" >".$paytype->name."</label></td>\n";
			if (!($i&1))
				$platnoscitable .= "</tr>\n";
			$i++;
		}		
		$platnoscitable .= "</table>\n";

		$smarty->assign(array(
		// Obligatory:
			'platnosciUrl' => $this->getPlatnosciUrl(),		
			'pos_id' => $pos_id,
			'pos_auth_key' => $pos_auth_key,
			'session_id' => intval($cart->id). '-' . substr(md5(time()), 16),
			'order_id' => intval($cart->id),
			'amount' => $cart->getOrderTotal() * 100,
			'desc' => 'Zakupy w sklepie '.Configuration::get('PS_SHOP_NAME'), 
			'client_ip' => $_SERVER["REMOTE_ADDR"],
			'platnoscitable' => $platnoscitablecss.$platnoscitable,
		// Voluntary:	
			'js' => 0,
			'desc2' => $cartproducts,
			'customer' => $customer,
			'address' => $address,
			'country' => 'PL',				
			'language' => 'pl' 				
		));
		return $this->display(__FILE__, 'platnosci-form.tpl');
	}

	public function paymentReturn()
	{
		global $smarty;
		$errorval = intval(Tools::getValue('error', 0));
		if ($errorval != 0){
			$smarty->assign(array(
				'errormessage' => $this->error_messages[$errorval]
			));
		}
		return $this->display(__FILE__, 'payment_return.tpl');
	}	

	public function get_status($parts){
		if ($parts['trans_pos_id'] != Configuration::get('PLATNOSCI_POS_ID')) return array('code' => false,'message' => 'bledny numer POS');  //--- bledny numer POS
		$md5feed = $parts['trans_pos_id'] . $parts['trans_session_id'] . $parts['trans_order_id'] . $parts['trans_status'] .$parts['trans_amount']. $parts['trans_desc'] . $parts['trans_ts'] . Configuration::get('PLATNOSCI_AUTH_KEY_2');
		$sig = md5($md5feed);
		if ($parts['trans_sig'] != $sig) return array('code' => false,'message' => 'bledny podpis');  //--- bledny podpis
			switch ($parts['trans_status']) {
				case 1: return array('code' => $parts['trans_status'], 'message' => 'nowa'); break;
				case 2: return array('code' => $parts['trans_status'], 'message' => 'anulowana'); break;
				case 3: return array('code' => $parts['trans_status'], 'message' => 'odrzucona'); break;
				case 4: return array('code' => $parts['trans_status'], 'message' => 'rozpoczeta'); break;
				case 5: return array('code' => $parts['trans_status'], 'message' => 'oczekuje na odbior'); break;
				case 6: return array('code' => $parts['trans_status'], 'message' => 'autoryzacja odmowna'); break;
				case 7: return array('code' => $parts['trans_status'], 'message' => 'platnosc odrzucona'); break;
				case 99: return array('code' => $parts['trans_status'], 'message' => 'platnosc odebrana - zakonczona'); break;
				case 888: return array('code' => $parts['trans_status'], 'message' => 'bledny status'); break;
				default: return array('code' => false, 'message' => 'brak statusu'); break;
		}
	}
}

?>
